//
//  YFViewModel.swift
//  微博
//
//  Created by 余仿 on 16/4/9.
//  Copyright © 2016年 YF. All rights reserved.
//

import UIKit

class YFViewModel: NSObject {


    static let sharedViewModels:YFViewModel = YFViewModel()

    var userAccount:YFUserAccount?

    var userLogIn:Bool{
        //如果用户信息模型有值,说明请求成功,是已登录状态,但是这不够,需要加一个判断,并且access_tocken没有过期
        //1.判断access_tocken是否过期,将当前时间和过期时间相比较
        //过期时间>当前时间----没有过期
        if let u = userAccount where u.expires_date.compare(NSDate()) == .OrderedDescending{

            return true

        }

        userAccount = nil

        return false
    }

    var headImageURL:NSURL?{

        return NSURL(string: userAccount?.avatar_large ?? "")
    }


    private override init() {


        super.init()

        userAccount = self.readUserInfo()
    }
    /*
    必选               类型及范围                  说明
    client_id           true 	string 	申请应用时分配的AppKey。
    client_secret       true 	string 	申请应用时分配的AppSecret。
    grant_type          true 	string 	请求的类型，填写authorization_code

    grant_type为authorization_code时

    必选              类型及范围                   说明
    code                true 	string 	调用authorize获得的code值。
    redirect_uri        true 	string 	回调地址，需需与注册应用里的回调地址一致。
    
    App Key：
    350157411
    App Secret：
    51f0aa2f95517eef9a11888af1bcabdc


    https://movie.douban.com/

    */

    //MARK:加载AccessToken
    func loadAccessToken(code:String,accessTokenFinished:(result:AnyObject)->()){


        HMNetworkTools.sharedTools.loadAccessToken(code) { (result, error) -> () in
            
            if error != nil{
                return;
            }
            //程序执行到这里,必然请求tocken成功
            //根据获得的token获取用户信息
            self.loadUserInfo(result!, finished: accessTokenFinished)

        }

    }

    /*
    access_token 	true 	string 	采用OAuth授权方式为必填参数，OAuth授权后获得。
    uid             false 	int64   需要查询的用户ID。
    */
    //MARK:加载用户信息
    func loadUserInfo(tockenResult:AnyObject,finished:(result:AnyObject)->()){

        //将AnyObject转为字典
        let dictResult = tockenResult as! [String:AnyObject]

        HMNetworkTools.sharedTools.loadUserInfo(tockenResult) { (result, error) -> () in

            if error != nil{

                return;
            }

            //程序执行到这里,必然请求用户信息成功
            //AnyObject转字典
            var userInfoResult = result as! [String:AnyObject]

            //用户信息也是字典,据说token还有用,因而同样需要存储起来,所以将两个字典合并

            //合并字典
            for (key,value) in dictResult{

                userInfoResult[key] = value
            }
            //将字典存储起来.里面有空值,然而setObject不能为nil
            self.saveUserInfo(userInfoResult,finish: finished)


        }
    }
}

//MARK:用户信息的读取
extension YFViewModel{

    //保存用户信息
    func saveUserInfo(userInfoResult:[String:AnyObject],finish:(userInfoResult:AnyObject) -> ()){

        //1.字典转模型,过滤不需要的键值,并且过滤空值
        let userAccountModel = YFUserAccount(dict: userInfoResult)

        //2.将模型转为字典,偏好设置智能存储字典

        let keys = ["name","access_token","avatar_large","expires_in","uid"]

        let userAccountDict = userAccountModel.dictionaryWithValuesForKeys(keys)

        //3.存储用户信息到沙盒
        let userDefault =  NSUserDefaults.standardUserDefaults()

        userDefault.setObject(userAccountDict, forKey: "userInfoResult")

        userDefault.synchronize()

        userAccount = userAccountModel

        finish(userInfoResult: userAccountModel)

    }
    
    //读取用户信息
    func readUserInfo() -> YFUserAccount?{

        //TODO:初次从沙盒读取,为nil,强制解包会导致崩溃,所以不能强制解包,?
        //可选形式的类型检查---就是as?----总是返回一个可选值（optional value），并且若下转是不可能的，可选值将是 nil
        let dict = NSUserDefaults.standardUserDefaults().objectForKey("userInfoResult") as? [String:AnyObject]
        
        guard let d = dict else{
            return nil;
        }
        
        return YFUserAccount(dict: d)
    }
    
}
